Lua线程

TestLuaThread.cs

    using UnityEngine;
    using System.Collections;
    using LuaInterface;

    public class TestLuaThread : MonoBehaviour 
    {
        string script =
            @"
                function fib(n)
                    local a, b = 0, 1
                    while n > 0 do
                        a, b = b, a + b
                        n = n - 1
                    end

                    return a
                end

                function CoFunc(len)
                    print('Coroutine started')                
                    local i = 0
                    for i = 0, len, 1 do                    
                        local flag = coroutine.yield(fib(i))                    
                        if not flag then
                            break
                        end                                      
                    end
                    print('Coroutine ended')
                end

                function Test()                
                    local co = coroutine.create(CoFunc)                                
                    return co
                end            
            ";

        LuaState state = null;
        LuaThread thread = null;

        void Start () 
        {
            state = new LuaState();
            state.Start();
            state.LogGC = true;
            state.DoString(script);

            LuaFunction func = state.GetFunction("Test");
            func.BeginPCall();
            func.PCall();
            thread = func.CheckLuaThread();
            thread.name = "LuaThread";
            func.EndPCall();
            func.Dispose();
            func = null;

            thread.Resume(10);
        }

        void OnDestroy()
        {
            if (thread != null)
            {
                thread.Dispose();
                thread = null;
            }

            state.Dispose();
            state = null;
        }

        void Update()
        {
            state.CheckTop();
            state.Collect();
        }

        void OnGUI()
        {
            if (GUI.Button(new Rect(10, 10, 120, 40), "Resume Thead"))
            {
                if (thread != null && thread.Resume(true) == (int)LuaThreadStatus.LUA_YIELD)
                {
                    object[] objs = thread.GetResult();
                    Debugger.Log("lua yield: " + objs[0]);
                }
            }
            else if (GUI.Button(new Rect(10, 60, 120, 40), "Close Thread"))
            {
                if (thread != null)
                {                
                    thread.Dispose();                
                    thread = null;
                }
            }
        }
    }

🔚

results matching ""

    No results matching ""